package network;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;

public class UdpEchoServer {
    private DatagramSocket socket = null;

    public UdpEchoServer(int port) throws SocketException {
        //参数为 端口号
        //程序一启动 就需要绑定上一个操作系统的端口号
        socket = new DatagramSocket(port);
    }

    //服务器启动逻辑
    public void start() throws IOException {
        System.out.println("服务器~ 启动！！");
        //服务器需要不停的收到请求返回响应
        //服务器单位时间内处理的请求，能返回的响应越多，服务器越强
        while(true){
            //每次循环就是处理一次请求-响应的过程
            //1.读取请求并解析
            DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);
            //通过字节数组保存收到的消息正文（应用层数据包）也就是udp的载荷部分 载荷长度可以自由定义
            socket.receive(requestPacket);//输出型参数 receive就可以接收到一个UDP数据报
            //将字节数组的内容转为字符串 —— 方便后续逻辑处理
            String request = new String(requestPacket.getData(),0,requestPacket.getLength());//getLength得到的时有效长度

            //2.根据请求计算响应
            String response = process(request);

            //3.把响应返回到客户端
            //创建一个DatagramPacket对象作为响应对象
            DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),
                    response.getBytes().length,
                    requestPacket.getSocketAddress());
            socket.send(responsePacket);

            //打印日志
            System.out.printf("[%s:%d] req:%s,resp:%s\n",
                    requestPacket.getAddress().toString(),
                    requestPacket.getPort(),
                    request,response);

            //服务器一般不退出
            //如果要退出服务器 直接kill这个进程
        }

    }

    public String process(String request){
        //根据请求计算相应
        //回显服务器 没有处理逻辑 直接返回请求
        return request;
    }

    public static void main(String[] args) throws IOException {
        //端口：可以任意指定  通常：1024 < 端口 < 65535
        UdpEchoServer server = new UdpEchoServer(9090);
        server.start();
    }

}
